package cn.itcast.service.cargo.impl;

import cn.itcast.dao.cargo.*;
import cn.itcast.domain.cargo.*;
import cn.itcast.service.cargo.ExportService;
import cn.itcast.vo.ExportProductResult;
import cn.itcast.vo.ExportResult;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.*;

/**
 * 报运单service实现类
 */
@Service
public class ExportServiceImpl implements ExportService {

	@Autowired
	private ExportDao exportDao;

	@Autowired
	private ContractDao contractDao;

	@Autowired
	private ContractProductDao contractProductDao; //购销合同货物Dao接口

	@Autowired
	private ExportProductDao exportProductDao; //报运单商品dao接口

	@Autowired
	private ExtCproductDao extCproductDao; //合同附件dao接口

	@Autowired
	private ExtEproductDao extEproductDao ;//报运单附件dao接口

	//根据id查询
	public Export findById(String id) {
		return exportDao.selectByPrimaryKey(id);
	}


	@Override
	public PageInfo findAll(ExportExample example, int page, int size) {
		PageHelper.startPage(page,size);
		List<Export> list = exportDao.selectByExample(example);
		return new PageInfo(list);
	}

	//更新保运结果

	/**
	 * 参数：海关通知的保运结果对象：ExportResult
	 *      保运结果 + 所有商品的set集合
	 * 业务：
	 *      1.更新保运单保运状态和保运结果
	 *      2.更新每个商品的关税
	 */
	public void updateE(ExportResult result) {
		//1.根据id查询报运单对象
		String exportId = result.getExportId();
		Export export = exportDao.selectByPrimaryKey(exportId);
		//2.设置保运结果
		export.setState(result.getState());
		export.setRemark(result.getRemark());
		//3.更新数据库
		exportDao.updateByPrimaryKeySelective(export);
		//4.循环保运商品结果数据列表
		if(result.getProducts() != null) {
			for (ExportProductResult epr : result.getProducts()) {
				//1.根据货物id查询货物
				ExportProduct ep = exportProductDao.selectByPrimaryKey(epr.getExportProductId());
				//2.设置tax
				ep.setTax(epr.getTax());
				//3.更新
				exportProductDao.updateByPrimaryKeySelective(ep);
			}
		}

	}

	/**
	 * 新增报运单
	 *  参数：报运单对象Export
	 *      对象中包含了一个参数：
	 *          contractIds ：页面勾选的多个合同id集合字符串（“，”分割）
	 */
	public void save(Export export) {
		//i. 保存报运单数据对象
		//1.设置报运单id
		export.setId(UUID.randomUUID().toString());
		//2.获取勾选合同id数据
		String contractIdS [] = export.getContractIds().split(",");    //1,2,3
		//3.查询所有合同
		String nos = "";
		int proNum=0;
		int extNum=0;
		for (String contractId : contractIdS) {
			Contract contract = contractDao.selectByPrimaryKey(contractId);
			//4.根据合同构造合同号的字符串，已“ ”隔开
			nos += contract.getContractNo()+" ";
			//5.设置购销合同状态为 已保运  （state=2）
			contract.setState(2);
			contractDao.updateByPrimaryKeySelective(contract);
		}
		export.setCustomerContract(nos);//设置合同号
		//ii. 据合同下的所有货物，生成报运单商品数据

		Map<String,String> map = new HashMap<>(); //存放 货物id和报运单商品id的关系    hw01-sp01

		//1.根据购销合同id，查询所有合同下的货物  list  //1,2,3
		ContractProductExample ce = new ContractProductExample();
		ContractProductExample.Criteria cc = ce.createCriteria();
		cc.andContractIdIn(Arrays.asList(contractIdS));   //select * from tab where contract_id in (1,2,3)
		List<ContractProduct> cps = contractProductDao.selectByExample(ce);
		//2.循环货物(ContractProduct)列表，构造商品对象(ExportProduct)
		for (ContractProduct cp : cps) {
			ExportProduct ep = new ExportProduct();
			//3.对商品普通属性赋值
			BeanUtils.copyProperties(cp,ep); //对象属性拷贝 ： 将cp中的同名属性值赋值到ep对象中
			//4.设置商品id
			ep.setId(UUID.randomUUID().toString());
			//5.设置商品所属的报运单id (外键 ：exportId)
			ep.setExportId(export.getId());
			//6.保存报运单商品
			exportProductDao.insertSelective(ep);

			map.put(cp.getId(),ep.getId());
		}
		proNum = cps.size(); //设置货物数量
		//iii. 根据合同下的所有附件，生成报运单附件数据
		//1.根据购销合同id查询所有的附件
		ExtCproductExample ece = new ExtCproductExample();
		ExtCproductExample.Criteria ecc = ece.createCriteria();
		ecc.andContractIdIn(Arrays.asList(contractIdS));
		List<ExtCproduct> ecps = extCproductDao.selectByExample(ece);
		//2.循环合同附件(ExtCproduct)列表，构造报运单附件（ExtEproduct）
		for (ExtCproduct ecp : ecps) {
			ExtEproduct eep = new ExtEproduct();
			//3.对报运单附件普通属性赋值
			BeanUtils.copyProperties(ecp,eep);
			//4.设置报运单附件id
			eep.setId(UUID.randomUUID().toString());
			//5.设置附件所属的报运单id (外键 ：exportId）
			eep.setExportId(export.getId());
			//6.设置所属的商品id exportProductId
			//ecp.getContractProductId(); //合同所属的货物id （hw01），对应的报运单商品id（sp01）
			String s = map.get(ecp.getContractProductId()); //报运单商品id
			eep.setExportProductId(s);
			//7.保存附件
			extEproductDao.insertSelective(eep);
		}
		extNum = ecps.size();
		//设置货物/附件数量
		export.setProNum(proNum); //货物
		export.setExtNum(extNum); //附件
		//设置状态
		export.setState(0);
		exportDao.insertSelective(export);
	}

	/**
	 * 	参数：export
	 * 	    对于更新来说：
	 * 	        包含了报运单的主体信息
	 * 	        包含了页面上修改的报运单商品的列表数据 ：exportProducts属性列表
	 */
	public void update(Export export) {
		exportDao.updateByPrimaryKeySelective(export);
		if(export.getExportProducts() != null && export.getExportProducts().size()>0) {
			//更新商品
			for (ExportProduct exportProduct : export.getExportProducts()) {
				exportProductDao.updateByPrimaryKeySelective(exportProduct);
			}
		}
	}


	public void delete(String id) {

	}

}
